gsk: Move scaling filters to GskRenderNode
authorEmmanuele Bassi <ebassi@gnome.org>
Sat, 13 Aug 2016 07:34:22 +0000 (08:34 +0100)
committerEmmanuele Bassi <ebassi@gnome.org>
Tue, 18 Oct 2016 10:49:14 +0000 (11:49 +0100)
The renderer will always use nearest-neighbor filters because it renders
at 1:1 pixel to texel ratio.

On the other hand, render nodes may be scaled, so we need to offer a way
to control the minification and magnification filters.

gsk/gskglrenderer.c
gsk/gskrenderer.c
gsk/gskrenderer.h
gsk/gskrendernode.c
gsk/gskrendernode.h
gsk/gskrendernodeprivate.h

index 4d5c4f36981fe00bd3de8e48548f026e8d97bda0..f9218eae0e116c8fbb89fb9af9140bb1aab175bc 100644 (file)
@@ -107,9 +107,6 @@ struct _GskGLRenderer
   GskGLProfiler *gl_profiler;
   GskShaderBuilder *shader_builder;
 
-  int gl_min_filter;
-  int gl_mag_filter;
-
   int blend_program_id;
   int blit_program_id;
 
@@ -515,15 +512,11 @@ render_item (GskGLRenderer *self,
 }
 
 static void
-get_gl_scaling_filters (GskRenderer *renderer,
-                        int         *min_filter_r,
-                        int         *mag_filter_r)
+get_gl_scaling_filters (GskRenderNode *node,
+                        int           *min_filter_r,
+                        int           *mag_filter_r)
 {
-  GskScalingFilter min_filter, mag_filter;
-
-  gsk_renderer_get_scaling_filters (renderer, &min_filter, &mag_filter);
-
-  switch (min_filter)
+  switch (node->min_filter)
     {
     case GSK_SCALING_FILTER_NEAREST:
       *min_filter_r = GL_NEAREST;
@@ -538,7 +531,7 @@ get_gl_scaling_filters (GskRenderer *renderer,
       break;
     }
 
-  switch (mag_filter)
+  switch (node->mag_filter)
     {
     case GSK_SCALING_FILTER_NEAREST:
       *mag_filter_r = GL_NEAREST;
@@ -711,6 +704,9 @@ gsk_gl_renderer_add_render_item (GskGLRenderer           *self,
   else if (gsk_render_node_has_surface (node))
     {
       cairo_surface_t *surface = gsk_render_node_get_surface (node);
+      int gl_min_filter = GL_NEAREST, gl_mag_filter = GL_NEAREST;
+
+      get_gl_scaling_filters (node, &gl_min_filter, &gl_mag_filter);
 
       /* Upload the Cairo surface to a GL texture */
       item.render_data.texture_id = gsk_gl_driver_create_texture (self->gl_driver,
@@ -720,8 +716,8 @@ gsk_gl_renderer_add_render_item (GskGLRenderer           *self,
       gsk_gl_driver_init_texture_with_surface (self->gl_driver,
                                                item.render_data.texture_id,
                                                surface,
-                                               self->gl_min_filter,
-                                               self->gl_mag_filter);
+                                               gl_min_filter,
+                                               gl_mag_filter);
     }
   else
     {
@@ -869,9 +865,6 @@ gsk_gl_renderer_render (GskRenderer       *renderer,
 
   gsk_gl_renderer_update_frustum (self, &modelview, &projection);
 
-  get_gl_scaling_filters (GSK_RENDERER (self),
-                          &self->gl_min_filter,
-                          &self->gl_mag_filter);
   if (!gsk_gl_renderer_validate_tree (self, root, &projection))
     goto out;
 
index 5d97d8546762818849702a1e7db7dc47bfcf72eb..b81c9dff9de77c21e5157a66288b2ca45c7d4cc1 100644 (file)
@@ -82,8 +82,6 @@ G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GskRenderer, gsk_renderer, G_TYPE_OBJECT)
 
 enum {
   PROP_VIEWPORT = 1,
-  PROP_MINIFICATION_FILTER,
-  PROP_MAGNIFICATION_FILTER,
   PROP_AUTO_CLEAR,
   PROP_USE_ALPHA,
   PROP_SCALE_FACTOR,
@@ -149,14 +147,6 @@ gsk_renderer_set_property (GObject      *gobject,
       gsk_renderer_set_viewport (self, g_value_get_boxed (value));
       break;
 
-    case PROP_MINIFICATION_FILTER:
-      gsk_renderer_set_scaling_filters (self, g_value_get_enum (value), priv->mag_filter);
-      break;
-
-    case PROP_MAGNIFICATION_FILTER:
-      gsk_renderer_set_scaling_filters (self, priv->min_filter, g_value_get_enum (value));
-      break;
-
     case PROP_AUTO_CLEAR:
       gsk_renderer_set_auto_clear (self, g_value_get_boolean (value));
       break;
@@ -195,14 +185,6 @@ gsk_renderer_get_property (GObject    *gobject,
       g_value_set_boxed (value, &priv->viewport);
       break;
 
-    case PROP_MINIFICATION_FILTER:
-      g_value_set_enum (value, priv->min_filter);
-      break;
-
-    case PROP_MAGNIFICATION_FILTER:
-      g_value_set_enum (value, priv->mag_filter);
-      break;
-
     case PROP_AUTO_CLEAR:
       g_value_set_boolean (value, priv->auto_clear);
       break;
@@ -276,44 +258,6 @@ gsk_renderer_class_init (GskRendererClass *klass)
                        G_PARAM_STATIC_STRINGS |
                        G_PARAM_EXPLICIT_NOTIFY);
 
-  /**
-   * GskRenderer:minification-filter:
-   *
-   * The filter to be used when scaling textures down.
-   *
-   * See also: gsk_renderer_set_scaling_filters()
-   *
-   * Since: 3.22
-   */
-  gsk_renderer_properties[PROP_MINIFICATION_FILTER] =
-    g_param_spec_enum ("minification-filter",
-                       "Minification Filter",
-                       "The minification filter used by the renderer for texture targets",
-                       GSK_TYPE_SCALING_FILTER,
-                       GSK_SCALING_FILTER_LINEAR,
-                       G_PARAM_READWRITE |
-                       G_PARAM_STATIC_STRINGS |
-                       G_PARAM_EXPLICIT_NOTIFY);
-
-  /**
-   * GskRenderer:magnification-filter:
-   *
-   * The filter to be used when scaling textures up.
-   *
-   * See also: gsk_renderer_set_scaling_filters()
-   *
-   * Since: 3.22
-   */
-  gsk_renderer_properties[PROP_MAGNIFICATION_FILTER] =
-    g_param_spec_enum ("magnification-filter",
-                       "Magnification Filter",
-                       "The magnification filter used by the renderer for texture targets",
-                       GSK_TYPE_SCALING_FILTER,
-                       GSK_SCALING_FILTER_LINEAR,
-                       G_PARAM_READWRITE |
-                       G_PARAM_STATIC_STRINGS |
-                       G_PARAM_EXPLICIT_NOTIFY);
-
   /**
    * GskRenderer:auto-clear:
    *
@@ -419,9 +363,6 @@ gsk_renderer_init (GskRenderer *self)
 
   priv->auto_clear = TRUE;
   priv->scale_factor = 1;
-
-  priv->min_filter = GSK_SCALING_FILTER_LINEAR;
-  priv->mag_filter = GSK_SCALING_FILTER_LINEAR;
 }
 
 /**
@@ -478,72 +419,6 @@ gsk_renderer_get_viewport (GskRenderer     *renderer,
   graphene_rect_init_from_rect (viewport, &priv->viewport);
 }
 
-/**
- * gsk_renderer_set_scaling_filters:
- * @renderer: a #GskRenderer
- * @min_filter: the minification scaling filter
- * @mag_filter: the magnification scaling filter
- *
- * Sets the scaling filters to be applied when scaling textures
- * up and down.
- *
- * Since: 3.22
- */
-void
-gsk_renderer_set_scaling_filters (GskRenderer      *renderer,
-                                  GskScalingFilter  min_filter,
-                                  GskScalingFilter  mag_filter)
-{
-  GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer);
-  GObject *gobject;
-
-  g_return_if_fail (GSK_IS_RENDERER (renderer));
-
-  gobject = G_OBJECT (renderer);
-
-  g_object_freeze_notify (gobject);
-
-  if (priv->min_filter != min_filter)
-    {
-      priv->min_filter = min_filter;
-      g_object_notify_by_pspec (gobject, gsk_renderer_properties[PROP_MINIFICATION_FILTER]);
-    }
-
-  if (priv->mag_filter != mag_filter)
-    {
-      priv->mag_filter = mag_filter;
-      g_object_notify_by_pspec (gobject, gsk_renderer_properties[PROP_MAGNIFICATION_FILTER]);
-    }
-
-  g_object_thaw_notify (gobject);
-}
-
-/**
- * gsk_renderer_get_scaling_filters:
- * @renderer: a #GskRenderer
- * @min_filter: (out) (nullable): return location for the minification filter
- * @mag_filter: (out) (nullable): return location for the magnification filter
- *
- * Retrieves the minification and magnification filters used by the #GskRenderer.
- *
- * Since: 3.22
- */
-void
-gsk_renderer_get_scaling_filters (GskRenderer      *renderer,
-                                  GskScalingFilter *min_filter,
-                                  GskScalingFilter *mag_filter)
-{
-  GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer);
-
-  g_return_if_fail (GSK_IS_RENDERER (renderer));
-
-  if (min_filter != NULL)
-    *min_filter = priv->min_filter;
-
-  if (mag_filter != NULL)
-    *mag_filter = priv->mag_filter;
-}
-
 /**
  * gsk_renderer_set_scale_factor:
  * @renderer: a #GskRenderer
index 28c587ad0c86ca585ff6aa7f3ee7982b4c66e78d..60195396e1e45a77e60a4466a40b2addc62dfa2b 100644 (file)
@@ -49,14 +49,6 @@ GDK_AVAILABLE_IN_3_22
 void                    gsk_renderer_get_viewport               (GskRenderer             *renderer,
                                                                  graphene_rect_t         *viewport);
 GDK_AVAILABLE_IN_3_22
-void                    gsk_renderer_set_scaling_filters        (GskRenderer             *renderer,
-                                                                 GskScalingFilter         min_filter,
-                                                                 GskScalingFilter         mag_filter);
-GDK_AVAILABLE_IN_3_22
-void                    gsk_renderer_get_scaling_filters        (GskRenderer             *renderer,
-                                                                 GskScalingFilter        *min_filter,
-                                                                 GskScalingFilter        *mag_filter);
-GDK_AVAILABLE_IN_3_22
 void                    gsk_renderer_set_scale_factor           (GskRenderer             *renderer,
                                                                  int                      scale_factor);
 GDK_AVAILABLE_IN_3_22
index c39480ee130d2572b2a363c8d6fbab89df92833e..63a1c371bee811a97b5a1b6d172eeb2c0b3c46b5 100644 (file)
@@ -182,6 +182,9 @@ gsk_render_node_init (GskRenderNode *self)
 
   self->opacity = 1.0;
 
+  self->min_filter = GSK_SCALING_FILTER_NEAREST;
+  self->mag_filter = GSK_SCALING_FILTER_NEAREST;
+
   self->is_mutable = TRUE;
   self->needs_world_matrix_update = TRUE;
 }
@@ -1244,6 +1247,19 @@ gsk_render_node_get_surface (GskRenderNode *node)
   return node->surface;
 }
 
+void
+gsk_render_node_set_scaling_filters (GskRenderNode    *node,
+                                     GskScalingFilter  min_filter,
+                                     GskScalingFilter  mag_filter)
+{
+  g_return_if_fail (GSK_IS_RENDER_NODE (node));
+
+  if (node->min_filter != min_filter)
+    node->min_filter = min_filter;
+  if (node->mag_filter != mag_filter)
+    node->mag_filter = mag_filter;
+}
+
 /*< private >
  * gsk_render_node_get_world_matrix:
  * @node: a #GskRenderNode
index d597ea7163b35ba7553f708b41ab1da2da3203e8..1aaa43ab5b04d7252cbc50a864d244afbf7a9893 100644 (file)
@@ -123,6 +123,11 @@ GDK_AVAILABLE_IN_3_22
 void                    gsk_render_node_set_texture             (GskRenderNode *node,
                                                                  int            texture_id);
 
+GDK_AVAILABLE_IN_3_22
+void                    gsk_render_node_set_scaling_filter      (GskRenderNode *node,
+                                                                 GskScalingFilter min_filter,
+                                                                 GskScalingFilter mag_filter);
+
 GDK_AVAILABLE_IN_3_22
 int                     gsk_render_node_get_scale_factor        (GskRenderNode *node);
 
index 84ee2f08fdfefd6297a35a33ced474884326f9a7..8077e73eeb5acc2c5b431cd33d8f36cef112ba74 100644 (file)
@@ -47,6 +47,10 @@ struct _GskRenderNode
   /* Blend mode */
   GskBlendMode blend_mode;
 
+  /* Scaling filters */
+  GskScalingFilter min_filter;
+  GskScalingFilter mag_filter;
+
   /* Clip rectangle */
   graphene_rect_t bounds;